package net.servir.capacidades.web.controller;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.CONSTANT;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.SistemaEtapa;
import net.servir.capacidades.model.StoredProcedureParameter;
import net.servir.capacidades.model.Test;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.Enumerados.ExportCommandType;
import net.servir.capacidades.model.Enumerados.ParameterDirection;
import net.servir.capacidades.model.Enumerados.StoredProcedureDataType;
import net.servir.capacidades.model.jsp.JspGestionPrueba;
import net.servir.capacidades.model.xls.XlsTableConfig;
import net.servir.capacidades.model.xls.XlsWorkbookConfig;
import net.servir.capacidades.model.xls.XlsWorksheetConfig;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class GestionPruebaController {

	@Autowired
	private CapacidadesService capacidadesService;
	@Autowired
	private CensoService censoService;

	@RequestMapping("/gestionPrueba.htm")
	public @ModelAttribute("gestionPrueba")
	JspGestionPrueba participanteBusqueda(HttpServletRequest request)
			throws Exception {

		JspGestionPrueba obj = new JspGestionPrueba();

		// ************************************************************
		// se obtiene el dni de la session activa
		// ************************************************************
		HttpSession session = request.getSession();
		String cod_session = session.getId();

		String dniResponsable = null;
		if (session.getAttribute("dni") != null)
			dniResponsable = session.getAttribute("dni").toString();

		// Obtenemos los datos del Usuario
		Usuario usuario = null;
		if (session.getAttribute("usuario") != null)
			usuario = (Usuario) session.getAttribute("usuario");

		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");

		obj.setUsuario(usuario);

		// ************************************************************

		Integer idTest = 0;
		Integer idSistema = 0;
		Integer idAmbito = 0;
		String conAmbito = "0";
		String accion = "accion";
		String msg = "";
		Integer informarPruebaPorCorreo = 0;
		
		if (request.getParameter("msgoff") != null)
			obj.setMensaje_usuario(request
					.getParameter("Carga ejecutada correctamente"));

		if (request.getParameter("idTest") != null)
			idTest = Integer.parseInt(request.getParameter("idTest"));

		if (request.getParameter("idTestNuevo") != null
				&& !request.getParameter("idTestNuevo").equals(""))
			idTest = Integer.parseInt(request.getParameter("idTestNuevo"));

		if (request.getParameter("idSistema") != null
				&& !request.getParameter("idSistema").equals(""))
			idSistema = Integer.parseInt(request.getParameter("idSistema"));

		if (request.getParameter("idAmbito") != null
				&& !request.getParameter("idAmbito").equals(""))
			idAmbito = Integer.parseInt(request.getParameter("idAmbito"));

		if (request.getParameter("accion") != null
				&& !request.getParameter("accion").equals(""))
			accion = request.getParameter("accion");
		/*
		 * @19022013 Arson Se agrega el filtro de pruebas por tipo de prueba
		 */
		if (request.getParameter("id_tipo_prueba") != null
				&& !request.getParameter("id_tipo_prueba").equals(""))
			obj.setIdTipoPrueba(Integer.parseInt(request
					.getParameter("id_tipo_prueba")));
		else
			obj.setIdTipoPrueba(0);
		/*
		 * @17042013 Arson Se agrega variable para controlar si se envían
		 * correos a los participantes cuando se Informa y Cierra una prueba
		 */
		if (request.getParameter("informarPruebaPorCorreo") != null
				&& !request.getParameter("informarPruebaPorCorreo").equals(""))
			informarPruebaPorCorreo = Integer.parseInt(request
					.getParameter("informarPruebaPorCorreo"));
		
		if (request.getParameter("id_sistema_etapa") != null && !request.getParameter("id_sistema_etapa").equals(""))
			obj.setId_sistema_etapa(Integer.parseInt(request
					.getParameter("id_sistema_etapa")));
		obj.setId_sistema_etapa(1);
		obj.setIdSistema(idSistema);
		obj.setIdAmbito(idAmbito);

		obj.setSistemas(capacidadesService.ObtenerSistema());
		LinkedList<SistemaEtapa> listaSistemaEtapa = capacidadesService.ObtenerSistemaEtapa((Number)idAmbito);
		obj.setSistemaEtapa(listaSistemaEtapa);
		
		if (accion.equals("REFRESCARSISTEMA"))
			idAmbito = 0;

		if (idSistema != 0) {
			Iterator itr = null;
			Sistema s = null;
			itr = obj.getSistemas().iterator();
			if (itr != null) {
				Integer total_rows = obj.getSistemas().size();
				Integer row = 0;
				while (itr.hasNext()) {
					row += 1;
					s = (Sistema) itr.next();
					if (s.getId_sistema().intValue() == idSistema) {
						obj.setAmbitos(capacidadesService
								.ObtenerAmbito(idSistema));
						if (s.getCon_ambitos().equals("1")) {
							conAmbito = "1";
						} else {
							idAmbito = obj.getAmbitos().getFirst()
									.getId_ambito().intValue();
						}
					}
				}
			}
		}
		
		
		
		if (idSistema == 0)
			idAmbito = 0;
		obj.setIdAmbito(idAmbito);

		obj.setTests(capacidadesService.ObtenerListaTest(idAmbito,
				obj.getIdTipoPrueba()));
		// busco el test activo

		if (idTest == null) {
			Iterator itrT = null;
			Test t = null;
			itrT = obj.getTests().iterator();
			if (itrT != null) {
				Integer total_rows = obj.getTests().size();
				Integer row = 0;
				while (itrT.hasNext()) {
					row += 1;
					t = (Test) itrT.next();
					if (row == 1)
						idTest = t.getId_test().intValue();

					if (t.getActivo().equals("S")) {
						if (idTest == null)
							idTest = t.getId_test().intValue();
					}
				}
			}
		}
		obj.setIdTest(idTest);
		session.setAttribute("informarpruebacheck", "elements/images/blank.gif");
		session.setAttribute("calificarchek", "elements/images/blank.gif");
		if (idTest > 0) {
			obj.setTest(censoService.obtenerTest(idTest));
			if (accion.equals("HABILITAR")) {
				censoService.habilitarPrueba(idTest);
				obj.setMensaje_usuario("El Diagnóstico fue HABILITADO correctamente");
			}
			if (accion.equals("INICIAR")) {
				censoService.iniciarPrueba(idTest);
				obj.setMensaje_usuario("El Diagnóstico fue INICIALIZADO correctamente");
				censoService.checkInicializarDeacHabilitar(idTest);
			}
			if (accion.equals("IMPRIMIR")) {
				// censoService.iniciarPrueba(idTest);
				obj.setMensaje_usuario("Se han generado la impresión de las pruebas offLine");
			}
			if (accion.equals("GENERAR")) {
				String des_error = "";
				des_error = censoService.generarPrueba(idTest);
				if (des_error == null){
					des_error="";
				}
				if (des_error.equals("") )
					des_error = "Las pruebas del Diagnóstico fueron GENERADAS correctamente";
				obj.setMensaje_usuario(des_error);
			}
			if (accion.equals("CALIFICAR")) {
				censoService.calificarPrueba(idTest);
				obj.setMensaje_usuario("Las pruebas del Diagnóstico fueron CALIFICADAS correctamente");
				session.setAttribute("calificarchek", "elements/images/check.png");
			}
			if (accion.equals("INFORMAR")) {
//				System.out.println("informarPruebaPorCorreo");
				censoService.informarPruebaPorCorreo(idTest);
				obj.setMensaje_usuario("Se ha informado a los participantes.");
				session.setAttribute("informarpruebacheck", "elements/images/check.png");
			}
			if (accion.equals("CERRAR")) {
//				System.out.println("cierraPrueba");
				censoService.cerrarPrueba(idTest);
				obj.setMensaje_usuario("EL Diagnóstico fue CERRADO correctamente.");
				//Se actualizan los datos del test para poder cerrarse
				//obj.setTest(censoService.obtenerTest(idTest));
			}
		}

		if (idSistema > 0) {
			List rptSeguimientoPrueba = capacidadesService.ObtenerDatosPrueba(
					idTest, idSistema, idAmbito);
			obj.setRptSeguimientoPrueba(rptSeguimientoPrueba);
			request.setAttribute("DATALIST", rptSeguimientoPrueba);
		}

		// Seteamos la variable de sesion para la exportacion de resultados
		// ************************************************************************
		// Generamos la configuracion de la exportacion a Excel
		// ************************************************************************
		List<XlsTableConfig> tables = new LinkedList<XlsTableConfig>();
		XlsTableConfig xlsTableConfig = new XlsTableConfig(
				"REPORTE.DETALLE_EVALUACION");
		xlsTableConfig.setCommand_type(ExportCommandType.STORE_PROCEDURE);
		List<StoredProcedureParameter> parameters = new LinkedList<StoredProcedureParameter>();
		parameters.add(new StoredProcedureParameter(
				StoredProcedureDataType.INT, ParameterDirection.IN, idTest));
		parameters.add(new StoredProcedureParameter(
				StoredProcedureDataType.INT, ParameterDirection.IN, idAmbito));
		parameters.add(new StoredProcedureParameter(
				StoredProcedureDataType.INT, ParameterDirection.IN, idSistema));
		parameters.add(new StoredProcedureParameter(
				StoredProcedureDataType.CURSOR, ParameterDirection.OUT));
		xlsTableConfig.setParameters(parameters);

		tables.add(xlsTableConfig);

		List<XlsWorksheetConfig> sheets = new LinkedList<XlsWorksheetConfig>();
		sheets.add(new XlsWorksheetConfig("Resultados", tables));

		XlsWorkbookConfig xlsWorkbookConfig = new XlsWorkbookConfig();
		xlsWorkbookConfig.setName("ResultadosEvaluacion");
		xlsWorkbookConfig.setSheets(sheets);

		session.setAttribute(CONSTANT.KEY_CFG_EXCEL_EXPORT, xlsWorkbookConfig);
		
		
		/*Logica Checks*/
		
		if(censoService.checkoficializar(idTest))
		{session.setAttribute("ofiParti", "elements/images/check.png");}
		else{session.setAttribute("ofiParti", "elements/images/blank.gif");}
	
		if(censoService.ceckIniciarlizar(idTest))
		{session.setAttribute("IniciarTest", "elements/images/check.png");}
		else{session.setAttribute("IniciarTest", "elements/images/blank.gif");}
		
		if(censoService.checkhabilitar(idTest))
		{session.setAttribute("HabilitarTest", "elements/images/check.png");}
		else{session.setAttribute("HabilitarTest", "elements/images/blank.gif");}
		
		if(censoService.checkGenePruebas(idTest))
		{session.setAttribute("Generarpruebas", "elements/images/check.png");}
		else{session.setAttribute("Generarpruebas", "elements/images/blank.gif");}
		
		/*if(censoService.checkCalificar(idTest))
		{session.setAttribute("calificar", "elements/images/check.png");}
		else{session.setAttribute("calificar", "elements/images/blank.gif");}*/
		
		if(censoService.checkCerrar(idTest))
		{session.setAttribute("cerrarPrueba", "elements/images/check.png");}
		else{session.setAttribute("cerrarPrueba", "elements/images/blank.gif");}
		
		
		return obj;
	}
}
